﻿using System.Collections.Generic;
using NHibernate;
using NHibernate.Criterion;
using Neturion.Dados;
using Neturion.IRepositorios;

namespace Neturion.Repositorios
{
    public class RepositorioPerfil : IRepositorioPerfil
    {
        public Perfil Inserir(Perfil perfil)
        {
            GerenciadorBDConfigs.Instance.SessaoAtual().Save(perfil);
            return perfil;
        }

        public Perfil Atualizar(Perfil perfil)
        {
            Perfil tmpPerfil = ObterPorId(perfil.PerfilId);
            // Atribuicao dos valores do objeto da memoria para o objeto obtido no banco de dados
            tmpPerfil.Descricao = perfil.Descricao;
            tmpPerfil.ListaSistemaPerfil.Clear();
            foreach (SistemaPerfil sistemaPerfil in perfil.ListaSistemaPerfil)
            {
                perfil.AdicionarSistemaPerfil(sistemaPerfil);
            }
            
            GerenciadorBDConfigs.Instance.SessaoAtual().Merge(tmpPerfil);
            return tmpPerfil;
        }

        public void Excluir(Perfil perfil)
        {
            GerenciadorBDConfigs.Instance.SessaoAtual().Delete(perfil);
        }

        public IList<Perfil> ObterTodos()
        {
            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(Perfil));
            return criteria.List<Perfil>() as List<Perfil>;
        }

        public IList<Perfil> ObterTodos(int inicio, int quantidade, int quantidadeMinima, string descricao)
        {
            if (quantidade.Equals(0))
            {
                quantidade = quantidadeMinima;
            }

            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(Perfil))
                .SetFirstResult(inicio).SetMaxResults(quantidade)
                .AddOrder(Order.Asc("Descricao"));

            if (!string.IsNullOrEmpty(descricao))
            {
                criteria.Add(Restrictions.Like("Descricao", descricao, MatchMode.Anywhere));
            }

            return criteria.List<Perfil>() as List<Perfil>;
        }

        public Perfil ObterPorId(int id)
        {
            return GerenciadorBDConfigs.Instance.SessaoAtual().Get<Perfil>(id);
        }
    }
}